package com.wpen.unit.infra.repository.system.impl;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.baomidou.mybatisplus.extension.toolkit.SqlHelper;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;

import org.springframework.stereotype.Repository;
import org.springframework.transaction.annotation.Transactional;

import com.wpen.unit.utils.StringUtil;
import com.wpen.unit.enums.YN;
import com.wpen.unit.exception.UpdateZeroException;

import com.wpen.unit.infra.mybatis.system.mapper.MenuMapper;
import com.wpen.unit.infra.mybatis.system.po.MenuPo.MenuColumns;
import com.wpen.unit.infra.mybatis.system.po.MenuPo;
import com.wpen.unit.infra.repository.system.MenuRepository;

/**
 * 菜单维护.
 * 
 * @author Wang Peng
 * @date 2022-12-22
 *
 */
@Repository
@Transactional
public class MenuRepositoryImpl extends ServiceImpl<MenuMapper, MenuPo> implements MenuRepository {

    @Override
    public List<MenuPo> queryListOrder() {
        QueryWrapper<MenuPo> queryWrapper = Wrappers.query();
        queryWrapper.eq(MenuColumns.STATUS.name(), YN.Yes.value());
        List<String> orders = new ArrayList<>();
        orders.add(MenuColumns.ORDERS.name());
        queryWrapper.orderByDesc(orders);
        return getBaseMapper().selectList(queryWrapper);
    }

    @Override
    public long count(MenuPo menuPo) {
        QueryWrapper<MenuPo> queryWrapper = createQuery(menuPo);
        return super.count(queryWrapper);
    }

    @Override
    public List<MenuPo> queryList(int index, int size, MenuPo menuPo) {
        QueryWrapper<MenuPo> queryWrapper = createQuery(menuPo);
        if (size > 0) {
            Page<MenuPo> page = new Page<>(index, size, false);
            return super.page(page, queryWrapper).getRecords();
        }
        // queryWrapper.orderBy(true, false, MenuColumns.ID.name());
        return getBaseMapper().selectList(queryWrapper);
    }

    private QueryWrapper<MenuPo> createQuery(MenuPo menuPo) {
        QueryWrapper<MenuPo> queryWrapper = Wrappers.query();
        if (menuPo.getId() != null) {
            queryWrapper.eq(MenuColumns.ID.name(), menuPo.getId());
        }
        if (StringUtil.isNotEmpty(menuPo.getMenuId())) {
            queryWrapper.eq(MenuColumns.MENU_ID.name(), menuPo.getMenuId());
        }
        if (StringUtil.isNotEmpty(menuPo.getMenuPid())) {
            queryWrapper.eq(MenuColumns.MENU_PID.name(), menuPo.getMenuPid());
        }
        if (StringUtil.isNotEmpty(menuPo.getMenuName())) {
            queryWrapper.eq(MenuColumns.MENU_NAME.name(), menuPo.getMenuName());
        }
        // if (StringUtil.isNotEmpty(menuPo.getMenuDesc())) {
        // queryWrapper.eq(MenuColumns.MENU_DESC.name(), menuPo.getMenuDesc());
        // }
        // if (StringUtil.isNotEmpty(menuPo.getMenuUrl())) {
        // queryWrapper.eq(MenuColumns.MENU_URL.name(), menuPo.getMenuUrl());
        // }
        // if (StringUtil.isNotEmpty(menuPo.getMenuImage())) {
        // queryWrapper.eq(MenuColumns.MENU_IMAGE.name(), menuPo.getMenuImage());
        // }
        // if (menuPo.getOrders() != null) {
        // queryWrapper.eq(MenuColumns.ORDERS.name(), menuPo.getOrders());
        // }
//        if (StringUtil.isNotEmpty(menuPo.getStatus())) {
//            queryWrapper.eq(MenuColumns.STATUS.name(), menuPo.getStatus());
//        }
//        if (menuPo.getVersion() != null) {
//            queryWrapper.eq(MenuColumns.VERSION.name(), menuPo.getVersion());
//        }
        return queryWrapper;
    }

    @Override
    public MenuPo queryFirst(MenuPo menuPo) {
        QueryWrapper<MenuPo> queryWrapper = Wrappers.query();
        if (menuPo.getId() != null) {
            queryWrapper.eq(MenuColumns.ID.name(), menuPo.getId());
        }
        if (StringUtil.isNotEmpty(menuPo.getMenuId())) {
            queryWrapper.eq(MenuColumns.MENU_ID.name(), menuPo.getMenuId());
        }
        if (StringUtil.isNotEmpty(menuPo.getMenuPid())) {
            queryWrapper.eq(MenuColumns.MENU_PID.name(), menuPo.getMenuPid());
        }
        if (StringUtil.isNotEmpty(menuPo.getMenuName())) {
            queryWrapper.eq(MenuColumns.MENU_NAME.name(), menuPo.getMenuName());
        }
        // if (StringUtil.isNotEmpty(menuPo.getMenuDesc())) {
        // queryWrapper.eq(MenuColumns.MENU_DESC.name(), menuPo.getMenuDesc());
        // }
        // if (StringUtil.isNotEmpty(menuPo.getMenuUrl())) {
        // queryWrapper.eq(MenuColumns.MENU_URL.name(), menuPo.getMenuUrl());
        // }
        // if (StringUtil.isNotEmpty(menuPo.getMenuImage())) {
        // queryWrapper.eq(MenuColumns.MENU_IMAGE.name(), menuPo.getMenuImage());
        // }
        // if (menuPo.getOrders() != null) {
        // queryWrapper.eq(MenuColumns.ORDERS.name(), menuPo.getOrders());
        // }
//        if (StringUtil.isNotEmpty(menuPo.getStatus())) {
//            queryWrapper.eq(MenuColumns.STATUS.name(), menuPo.getStatus());
//        }
//        if (menuPo.getVersion() != null) {
//            queryWrapper.eq(MenuColumns.VERSION.name(), menuPo.getVersion());
//        }
        // queryWrapper.orderBy(true, false, MenuPoColumns.ID.name());
        return super.getOne(queryWrapper);
    }

    @Override
    public MenuPo queryById(Serializable id) {
        return super.getById(id);
    }

    @Override
    public boolean insert(MenuPo menuPo) {
        menuPo.setVersion(1);
        menuPo.setUpdateTime(new java.sql.Timestamp(System.currentTimeMillis()));
        return super.save(menuPo);
    }

    @Override
    public boolean insertBatch(List<MenuPo> listMenuPos) {
        int rs = getBaseMapper().insertBatchSomeColumn(listMenuPos);
        return SqlHelper.retBool(rs);
    }

    @Override
    public boolean updateById(MenuPo menuPo) {
        UpdateWrapper<MenuPo> updateWrapper = Wrappers.update();
        updateWrapper.eq(MenuColumns.ID.name(), menuPo.getId());
        updateWrapper.eq(MenuColumns.VERSION.name(), menuPo.getVersion());
        menuPo.setVersion(menuPo.getVersion() + 1);
        boolean rs = super.update(menuPo, updateWrapper);
        // 根据ID更新所有字段，空值也更新
        // int num = getBaseMapper().alwaysUpdateSomeColumnById(ucpBatchInfoPo);
        // boolean rs = SqlHelper.retBool(num);
        if (!rs) {
            throw new UpdateZeroException();
        }
        return rs;
    }

    @Override
    public boolean deleteByIds(Serializable[] ids) {
        UpdateWrapper<MenuPo> updateWrapper = Wrappers.update();
        updateWrapper.in(MenuColumns.ID.name(), (Object[]) ids);
        return super.remove(updateWrapper);
    }

//    public MenuPo queryByExample(MenuPo menuPo) {
//        QueryWrapper<MenuPo> queryWrapper = Wrappers.query();
//        if (menuPo.getId() != null) {
//            queryWrapper.eq(MenuColumns.ID.name(), menuPo.getId());
//        }
//        if (StringUtil.isNotEmpty(menuPo.getMenuId())) {
//            queryWrapper.eq(MenuColumns.MENU_ID.name(), menuPo.getMenuId());
//        }
//        if (StringUtil.isNotEmpty(menuPo.getMenuPid())) {
//            queryWrapper.eq(MenuColumns.MENU_PID.name(), menuPo.getMenuPid());
//        }
//        if (StringUtil.isNotEmpty(menuPo.getMenuName())) {
//            queryWrapper.eq(MenuColumns.MENU_NAME.name(), menuPo.getMenuName());
//        }
//        if (StringUtil.isNotEmpty(menuPo.getMenuDesc())) {
//            queryWrapper.eq(MenuColumns.MENU_DESC.name(), menuPo.getMenuDesc());
//        }
//        if (StringUtil.isNotEmpty(menuPo.getMenuUrl())) {
//            queryWrapper.eq(MenuColumns.MENU_URL.name(), menuPo.getMenuUrl());
//        }
//        if (StringUtil.isNotEmpty(menuPo.getMenuImage())) {
//            queryWrapper.eq(MenuColumns.MENU_IMAGE.name(), menuPo.getMenuImage());
//        }
//        if (menuPo.getOrders() != null) {
//            queryWrapper.eq(MenuColumns.ORDERS.name(), menuPo.getOrders());
//        }
//        if (StringUtil.isNotEmpty(menuPo.getStatus())) {
//            queryWrapper.eq(MenuColumns.STATUS.name(), menuPo.getStatus());
//        }
//        if (menuPo.getVersion() != null) {
//            queryWrapper.eq(MenuColumns.VERSION.name(), menuPo.getVersion());
//        }
//		Page<MenuPo> page = new Page<>(0, 1, false);
//		queryWrapper.orderBy(true, false, MenuPoColumns.ID.name());
//    }

}
